from django.shortcuts import render
from django.views import View
from django.http import JsonResponse,HttpResponse

from verifications.libs.captcha.captcha import captcha
from verifications.libs.yuntongxun.ccp_sms import CCP

from celery_tasks.sms.tasks import ccp_send_sms_code
# 测试
from celery_tasks.test.tasks import get_image_code

# get_redis_connection("verify_code")
# 功能：获取一个redis的连接对象
# 参数：django缓存配置选项
# 返回值：连接对象
from django_redis import get_redis_connection

import re, random
# Create your views here.


# 获取图形验证码接口
class ImageCodeView(View):

    def get(self, request, uuid):
        # 1.提取参数
        # 2.校验参数
        # 3.业务逻辑处理
        # 3.1、调用captcha生成验证码图片
        # text: 验证码，类型是字符串
        # image: 图片数据，类型是字节
        text,image = captcha.generate_captcha()

        # 3.2、验证码text存入redis(以uuid作为key)
        # set img_<uuid> <text>
        # 获取django缓存配置项"verify_code"
        try:
            conn = get_redis_connection("verify_code")
            # conn.setex("键", 超时时间 "值")
            # conn.set("img_%s"%uuid, text)
            conn.setex("img_%s"%uuid, 300, text)
        except Exception as e:
            print(e)
            return JsonResponse({
                "code": 400,
                "errmsg": "redis写入图形验证码失败"
            }, status=500)

        # 3.3、返回图片image
        # 4.构建响应
        return HttpResponse(image, content_type="image/jpeg")


class SMSCodeView(View):

    def get(self, request, mobile):

        # CCP().send_template_sms('17600992168', ['1234', 5], 1)
        # 1.提取参数
        image_code = request.GET.get("image_code") # 用户填写的图片验证码
        uuid = request.GET.get("image_code_id") # 用户图形验证码的uuid

        # 2.校验参数
        if not all([image_code, uuid]):
            return JsonResponse({"code": 400, "errmsg": "缺少必要的参数"})
        if not re.match(r"^[a-zA-Z0-9]{4}$", image_code):
            return JsonResponse({"code": 400, "errmsg": "图形验证码格式错误"})
        if not re.match(r'^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$', uuid):
            return JsonResponse({'code': 400, 'errmsg': 'uuid格式有误'})

        # 图形验证码校验 —— 根据uuid获取redis中的图形验证码，和用户填写的比对
        conn = get_redis_connection("verify_code")
        text = conn.get("img_%s"%uuid) # b"TYUP", redis客户端读取返回的数据统一是"字节"类型
        # TODO 为了保证图片验证码之后被使用一次，只需要读一次立刻删除
        conn.delete("img_%s"%uuid)

        if not text:
            return JsonResponse({"code": 400, "errmsg": "图形验证码过期"}, status=500)

        if image_code.lower() != text.decode().lower():
            return JsonResponse({"code": 400, "errmsg": "图形验证码错误"}, status=400)

        # 实现避免短信过于频繁发送, 设置６０ｓ的标志
        # key:send_flag_mobile value:1(随意)
        send_flag = conn.get("send_flag_%s"%mobile)
        if send_flag:
            return JsonResponse({"code": 400, "errmsg": "请求短信过于频繁"}, status=400)

        # 3.业务处理－－－发送短信
        # 生成固定6位数长度的0-9字符组成的验证码
        sms_code = "%06d" % random.randrange(0, 999999)

        # 创建管道对象
        pl = conn.pipeline()
        pl.setex("sms_%s"%mobile, 300, sms_code)
        pl.setex("send_flag_%s"%mobile, 60, 1)

        pl.execute()


        # try:
        #     conn.setex("sms_%s"%mobile, 300, sms_code)
        # except Exception as e:
        #     print(e)
        #     return JsonResponse({"code": 400, "errmsg": "图形验证码写入数据库错误"}, status=500)

        # 发送短信
        # send_template_sms(to, datas, temp_id)
        # to: 手机号
        # datas: 内容数据 格式为数组[] [验证码, 过期时间]
        # temp_id: 模板　测试模板固定为１
        # ccp = CCP()
        # ccp.send_template_sms(mobile, [sms_code, 5], 1)

        ccp_send_sms_code.delay(mobile, sms_code)
        print("短信验证码：", sms_code, mobile)

        # 测试
        get_image_code.delay()
        print("views")

        # conn.setex("send_flag_%s"%mobile, 60, 1)

        return JsonResponse({"code": 0, "errmsg": "ok"})



